package pe.com.hermes.hermetic.web.controller.general;

import pe.com.hermes.hermetic.beans.CuentaBean;
import pe.com.hermes.hermetic.beans.MatrizBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.forms.SelecCuentaForm;
import pe.com.hermes.hermetic.web.forms.SelectMatrizForm;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@RequestMapping("/selecCuenta.html")
@SessionAttributes(value={"form"})
public class SeleccionarCuentaController implements IController{
    protected final static Logger logger = Logger.getLogger(SeleccionarCuentaController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    @RequestMapping(method={RequestMethod.GET})    
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        try {
            logger.info(this.getClass().toString()+" "+"metodo: GET");
            SelecCuentaForm form = new SelecCuentaForm();
            form.setCliente((String)request.getSession(false).getAttribute("cliente"));
            form.setCodSucuHtb((String)request.getSession(false).getAttribute("sucursal"));
            //List listSucursales = servicioHermetic.getSucursalesNoTodos();
            List listCuentas = new ArrayList();        
            //listCuentas = servicioHermetic.   getlistCuentas(form.getCliente(),form.getCodSucuHtb(),"");
            listCuentas = servicioHermetic.getCuentas(form.getCodSucuHtb(), form.getCliente());        
            //asigno los valores de las cuentas seleccionadas en session
            String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
            listCuentas = Util.setChksSession(chksCuenta, listCuentas);
            form.setListCuentas(listCuentas);               
            request.getSession(false).setAttribute("listCuentas",listCuentas);
            //model.put("listSucursales",listSucursales);
            
            //Borro las cuentas de la sesion
            //request.getSession(false).setAttribute("chksCuenta",null);
            
            model.put("listCuentas",listCuentas);
            model.put(FORM_KEY,form);
            return FORM_SELECT_CUENTA;
        }
        catch (Exception e) {
            return FORM_ERROR_POPUP_VIEW;
        }
    }
    @RequestMapping(params={"accion=buscarCuenta","desCuenta"}) 
    protected String buscarCuenta(@RequestParam("desCuenta") String desCuenta ,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        SelecCuentaForm form = new SelecCuentaForm();
        form.setCliente((String)request.getSession(false).getAttribute("cliente"));    
        form.setCodSucuHtb((String)request.getSession(false).getAttribute("sucursal"));
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                
        List listCuentas = new ArrayList();        
        listCuentas = servicioHermetic.getDesCuentas(form.getCodSucuHtb(),form.getCliente(),desCuenta);
        listCuentas = Util.setChksSession(chksCuenta, listCuentas);        
        form.setListCuentas(listCuentas);
        //if(desCuenta.equals(""))
        
        request.getSession(false).setAttribute("listCuentas",listCuentas);
        //model.put("listSucursales",listSucursales);
        model.put("listCuentas",listCuentas);
        model.put(FORM_KEY,form);
        return FORM_SELECT_CUENTA;
    }
    
    @RequestMapping(params={"accion=searchDesMat"}) 
    protected @ResponseBody String[] searchDesMat(HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: searchDesMat");        
        List listCuentas = (List)request.getSession(false).getAttribute("listCuentas");
        String[] arrayCuentas = new String[listCuentas.size()];
        for(int i=0;i<listCuentas.size();i++){
            arrayCuentas[i] = ((CuentaBean)listCuentas.get(i)).getDescripcion();
        }
        return arrayCuentas;
    }
    @RequestMapping(params={"accion=selectCodCuenta","codMat"}) 
    protected @ResponseBody String[] selectCodCuenta(@RequestParam("codMat") String codMat,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: selectCodMat");        
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
        if(("").equals(codMat))
            return chksCuenta; 
        if(chksCuenta!=null)
            for(int i=0;i<chksCuenta.length;i++){                
                if(chksCuenta[i]!=null&&chksCuenta[i].equals(codMat)){
                    break;
                }
                if(chksCuenta[i]==null){
                    chksCuenta[i] = codMat;
                    break;
                }
            }            
        else{
            chksCuenta= new String[1000];
            chksCuenta[0]=codMat;
        }        
        request.getSession(false).setAttribute("chksCuenta",chksCuenta);        
        return chksCuenta;
    }
    
    @RequestMapping(params={"accion=deselectCodCuenta","codMat"}) 
    protected @ResponseBody String[] deselectCodCuenta(@RequestParam("codMat") String codMat,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: deselectCodCuenta");        
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");

        if(chksCuenta!=null && chksCuenta.length > 0)
            for(int i=0;i<chksCuenta.length;i++){                
                if(chksCuenta[i]!=null && chksCuenta[i].equals(codMat)){
                    chksCuenta[i] = null;
                    break;
                }
            }            
        
        request.getSession(false).setAttribute("chksCuenta",chksCuenta);        
        return chksCuenta;
    }    
    
    @RequestMapping(params={"accion=seleccionarCuentas"})
    protected void seleccionarCuentas(ModelMap model,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{
        logger.info("seleccionarCuentas");
        String[] _chk = request.getParameterValues("_chk");
        request.getSession(false).setAttribute("_chk",_chk);
    }  

    @RequestMapping(params={"accion=selectTodos","codTodos"}) 
    protected String selectTodos(@RequestParam("codTodos") boolean codTodos ,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        SelecCuentaForm form = (SelecCuentaForm)model.get("form");//new SelecCuentaForm();
        
        //Asigno el check a todos los elenmentos de la lista Cuenta        
        List listCuentas = form.getListCuentas(); 
        listCuentas = Util.setChksTodos(codTodos, listCuentas);        
        form.setListCuentas(listCuentas);
        
        //Subo a session los todos los Checks Cuenta
        if (codTodos) {
            String[] chksCuenta = Util.listToStringArray(listCuentas);
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);       
        }else {
            request.getSession(false).setAttribute("chksCuenta",null);        
        }
        
        request.getSession(false).setAttribute("listCuentas",listCuentas);
        model.put("listCuentas",listCuentas);
        model.put(FORM_KEY,form);
        return FORM_SELECT_CUENTA;
    }
    @RequestMapping(params={"accion=verifyCuenta","cuenta"}) 
    protected @ResponseBody boolean verifyCuenta(@RequestParam("cuenta") String cuenta,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: verifyCuenta");        
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
        boolean hasCuentas = false;        
        if(("1").equals(cuenta))
            hasCuentas =  true;        
        if(("2").equals(cuenta)&&chksCuenta!=null)
            hasCuentas =  true;
        return hasCuentas;
    }   
    @RequestMapping(params={"accion=getListTipUnidMone","cuenta"})
    protected @ResponseBody TiposBean[] getListTipUnidMone(@RequestParam("cuenta") String cuenta ,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: getListTipUnidMone");
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        List listadoCuentas = new ArrayList();
        List listadoUnidMone = new ArrayList();
        String[] chksCuenta = null;
        String codCuentas = null;
        TiposBean[] listadoUnidMoneArray = null;
        try{
            if("1".equals(cuenta)){
                listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
                chksCuenta = Util.listToStringArray(listadoCuentas);     
                codCuentas = Util.arrayToString(chksCuenta,",");      
                listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, codCuentas);
            }
            if("2".equals(cuenta)){
                chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                codCuentas = Util.arrayToString(chksCuenta,",");
                listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, codCuentas);
            }
        }catch(Exception e){
            logger.error(e);
        }
        listadoUnidMoneArray = new TiposBean[listadoUnidMone.size()];
        listadoUnidMone.toArray(listadoUnidMoneArray);
        return listadoUnidMoneArray;
    }  
}
